/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxline.atlasmobile.manager;

import br.com.foxline.atlasmobile.enums.*;
import br.com.foxline.enums.TypeRealty;
import br.com.foxline.model.*;
import br.com.foxline.service.*;
import br.com.foxline.util.Caracter;
import br.com.foxline.util.CoordinateConversion;
import br.com.foxline.util.Msg;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.map.MarkerDragEvent;
import org.primefaces.model.map.*;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
public class ManagerEditImovel implements Serializable{

    @EJB
    ImovelService imovelDao;
    @EJB
    ProprietarioService proprietarioService;
    @EJB
    CoordenadaService coordenadaService;
    @EJB
    AnnexService annexService;
    @EJB
    EnderecoService enderecoService;
    private Imovel imovel;
    private List<Imovel> imoveis;
    private Proprietario proprietario;
    private String eImovel;
    private Imovel editImovel;
    private Imovel visaoImovel;
    private Imovel pesImovel;
    private Proprietario pesProprietario;
    private Endereco pesEndereco;
    private List<Annex> annexs;
    private List<Annex> annexCroquis;
    // Georreferenciamento
    LatLng latlong;
    private Coordenada coordenada;
    private List<Coordenada> coordenadas;
    private MapModel mapModel;
    private String convN;
    private String convE;
    private String convZona;
    private Coordenada editCoordenada;
    private Coordenada visuCoordenada;
    private Coordenada delCoordenada;
    private Coordenada posCoordenada;
    private Boolean cima;
    private Boolean baixo;
    private Morador morador;
    private int moradoresInicio;
    private int moradoresFim;
    private boolean disableInputsMorador;
    private boolean disableEnderecoImovel;
    private boolean disableEnderecoCorrespondencia = false;
    private Annex annexCroqui;
    private Annex annex;
    private String visaoInscricao = "";
    private String center;
    private boolean usarMesmoEndereco;

    @PostConstruct
    public void init() {
        editImovel = new Imovel();
        imovel = new Imovel();
        proprietario = new Proprietario();
        proprietario.setTipoDocumento(TipoDocumento.CPF);
        pesImovel = new Imovel();

        pesEndereco = new Endereco();
        pesProprietario = new Proprietario();
        pesProprietario.setTipoDocumento(TipoDocumento.CPF);

        cima = Boolean.FALSE;
        baixo = Boolean.FALSE;

        coordenada = new Coordenada();
        coordenadas = new ArrayList<Coordenada>();

        morador = new Morador();
        annex = new Annex();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        eImovel = params.get("eImovel");
        paramPost();

        plotar();
    }

    public void clear() {
        imoveis = new ArrayList<Imovel>();
    }

    public void plotar() {
        mapModel = new DefaultMapModel();
        LatLng coord = null;
        Polygon polygon = new Polygon();
        if (!coordenadas.isEmpty()) {
            for (Coordenada c : coordenadas) {
                coord = new LatLng(c.getLat(), c.getLog());
                center = c.getLat() + ", " + c.getLog();
                Marker marker = new Marker(coord, "");

                if (editImovel.getProprietarios() == null || editImovel.getProprietarios().isEmpty()) {
                    marker.setTitle("Não existe(m) proprietário(s)");
                }

                for (Proprietario p : editImovel.getProprietarios()) {
                    marker.setTitle(marker.getTitle() + ", " + p.getNome());
                }

                marker.setDraggable(true);
                mapModel.addOverlay(marker);
            }
        }

    }

    public void add() {
        String lat = coordenada.getConvN();
        String lon = 24 + coordenada.getConvE();
        String zona = convZona;

        try {
            lat = lat.replace(" ", "");
            lon = lon.replace(" ", "");
            if (zona == null) {
                zona = "M";
            }

            CoordinateConversion cc = new CoordinateConversion();

            String UTM = lon.toString().substring(0, 2) + " " + zona + " " + lon.toString().substring(2) + " " + lat.toString();
            System.err.println("CONVERTENDO COORDENADA: " + UTM);

            coordenada.setLat(cc.utm2LatLon(UTM)[0]);
            coordenada.setLog(cc.utm2LatLon(UTM)[1]);
            coordenada.setConvE(lon);
            coordenada.setConvN(lat);
            coordenada.setConvZona(zona);
            coordenadas.add(coordenada);
            coordenada = new Coordenada();
            plotar();
//            System.out.println(coordenadas);

        } catch (Exception e) {
            Msg.messagemError("Valores Incorretos(COORDENADA)");
        }

    }

    public void atualizarCoordenada() {
        String lat = editCoordenada.getConvN();
        String lon = editCoordenada.getConvE();
        String zona = editCoordenada.getConvZona();

        try {
            lat = lat.replace(" ", "");
            lon = lon.replace(" ", "");
            if (zona == null) {
                zona = "M";
            }

            CoordinateConversion cc = new CoordinateConversion();

            String UTM = lon.toString().substring(0, 2) + " " + zona + " " + lon.toString().substring(2) + " " + lat.toString();
            System.err.println("CONVERTENDO COORDENADA: " + UTM);

            editCoordenada.setLat(cc.utm2LatLon(UTM)[0]);
            editCoordenada.setLog(cc.utm2LatLon(UTM)[1]);
            editCoordenada.setConvE(lon);
            editCoordenada.setConvN(lat);
            editCoordenada.setConvZona(zona);
            plotar();
            System.out.println(editCoordenada);
        } catch (Exception e) {
            Msg.messagemError("Valores Incorretos(COORDENADA)");
        }
    }

    public void addMorador() {
        if (editImovel.getMoradores().size() < moradoresFim) {
            if (morador.getNome().equals("") || morador.getNome() == null) {
                Msg.messagemError("O campo Nome é obrigatório !");
                return;
            }
            editImovel.getMoradores().add(morador);
            morador = new Morador();
        }
//        if (imovel.getMoradores().size() == moradoresFim) {
//            disableInputsMorador = true;
//        }
    }

    public void editarMorador(int id, Morador morador) {
        this.morador = morador;
        removerMorador(id);
    }

    public void removerMorador(int id) {
        editImovel.getMoradores().remove(id);
        disableInputsMorador = false;
    }

    public void verificaComposicaoFamiliar() {
        int inicio = moradoresInicio;
        if (editImovel.getComposicaoFamiliar() != null) {
            if (editImovel.getComposicaoFamiliar().equals(ComposicaoFamiliar.ATE_DUAS)) {
                moradoresInicio = 1;
                moradoresFim = 2;
            } else if (editImovel.getComposicaoFamiliar().equals(ComposicaoFamiliar.TRES_CINCO)) {
                moradoresInicio = 3;
                moradoresFim = 5;
            } else if (editImovel.getComposicaoFamiliar().equals(ComposicaoFamiliar.SEIS_NOVE)) {
                moradoresInicio = 6;
                moradoresFim = 9;
            } else if (editImovel.getComposicaoFamiliar().equals(ComposicaoFamiliar.DEZ_QUINZE)) {
                moradoresInicio = 10;
                moradoresFim = 15;
            } else {
                moradoresInicio = 16;
                moradoresFim = 99999;
            }

            editImovel.setMoradores(new ArrayList<Morador>());
        }

//        if (inicio < moradoresInicio) {
//            disableInputsMorador = false;
//        } else if (inicio > moradoresInicio) {
//            disableInputsMorador = true;
//            for (int i = imovel.getMoradores().size()-1; i > moradoresInicio; i--) {
//                imovel.getMoradores().remove(i);
//            }
//        } else if(imovel.getMoradores().size() > moradoresInicio) {
//            disableInputsMorador = true;
//        }
    }

    public void editarCoordenada(Coordenada coordenada) {
        this.coordenada = coordenada;
        this.coordenadas.remove(coordenada);
    }

    public void visualizarCoordenada(Coordenada coordenada) {
        this.visuCoordenada = coordenada;
    }

    public void delete(Coordenada coordenada) {
        this.coordenadas.remove(coordenada);
    }

    public void position(Coordenada coordenada) {
        posCoordenada = coordenada;
        int tam = coordenadas.size();
        if (posCoordenada == coordenadas.get(0)) {
            cima = Boolean.FALSE;
            baixo = Boolean.TRUE;
            System.out.println("POSICAO INÍCIO");
        }
        if (posCoordenada != coordenadas.get(tam - 1) && posCoordenada != coordenadas.get(0)) {
            cima = Boolean.TRUE;
            baixo = Boolean.TRUE;
            System.out.println("POSICAO NORMAL");
        }

        if (posCoordenada == coordenadas.get(tam - 1)) {
            cima = Boolean.TRUE;
            baixo = Boolean.FALSE;
            System.out.println("POSICAO FIM");
        }

    }

    public void mudarposicao() {
        List<Coordenada> lsCoordenadas = new ArrayList<Coordenada>();
        List<Coordenada> newCoordenadas = new ArrayList<Coordenada>();

        if (baixo) {
            int i = coordenadas.indexOf(posCoordenada);

            Collections.swap(coordenadas, i, i + 1);
            lsCoordenadas.addAll(coordenadas);
            coordenadas.remove(i);
            coordenadas.remove(i++);

            editImovel.setCoordenadas(coordenadas);
            imovelDao.update(editImovel);



            for (Coordenada coor : lsCoordenadas) {
//               System.out.println(coor);
//               coor.setId(null);
                System.out.println(coor);
                coordenadas.add(coor);


            }

//            editImovel.setCoordenadas();
//            imovelDao.update(editImovel);

        }
    }

    public void paramPost() {
        try {
            if (eImovel != null) {

                editImovel = imovelDao.find(Long.parseLong(eImovel));
                editImovel.setProprietarios(imovelDao.lstProprietario(editImovel));
                coordenadas = imovelDao.lstCoordenadas(editImovel);
                annexs = imovelDao.lstAnnexs(editImovel);
                annexCroquis = imovelDao.lstAnnexCroqui(editImovel);
                if (annexCroquis == null) {
                    annexCroquis = new ArrayList<Annex>();
                }
                if (editImovel.getEnderecoImovel() == null) {
                    editImovel.setEnderecoImovel(new Endereco());
                }
                if (editImovel.getEnderecoImovel().getCep() != null && !editImovel.getEnderecoImovel().getCep().equals("")) {
                    disableEnderecoImovel = true;
                } else {
                    disableEnderecoImovel = false;
                }
                if (editImovel.getEnderecoCorrespondencia() == null) {
                    editImovel.setEnderecoCorrespondencia(new Endereco());
                }
                if (editImovel.getEnderecoCorrespondencia().getCep() != null && !editImovel.getEnderecoCorrespondencia().getCep().equals("")) {
                    disableEnderecoCorrespondencia = true;
                } else {
                    disableEnderecoCorrespondencia = false;
                }
                if (editImovel.getDimensoes() == null) {
                    editImovel.setDimensoes(new Dimensao());
                }
                List<Morador> moradores = editImovel.getMoradores();
                verificaComposicaoFamiliar();
                editImovel.setMoradores(moradores);


                DecimalFormat d = new DecimalFormat("");
                d.setMinimumIntegerDigits(2);

                visaoInscricao += d.format(editImovel.getInscricaoCadastralD() == null ? 0 : editImovel.getInscricaoCadastralD());
                visaoInscricao += d.format(editImovel.getInscricaoCadastralS() == null ? 0 : editImovel.getInscricaoCadastralS());
                d.setMinimumIntegerDigits(3);
                visaoInscricao += d.format(editImovel.getInscricaoCadastralQuadra() == null ? 0 : editImovel.getInscricaoCadastralQuadra());
                d.setMinimumIntegerDigits(4);
                d.setDecimalSeparatorAlwaysShown(false);
                visaoInscricao += d.format(editImovel.getInscricaoCadastralLote() == null ? 0 : editImovel.getInscricaoCadastralLote());
                d.setMinimumIntegerDigits(2);
                visaoInscricao += d.format(editImovel.getInscricaoCadastralUnid() == null ? 0 : editImovel.getInscricaoCadastralUnid());

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//     Sacado sacado = null;
//
//        for (Proprietario p : visaoImovel.getProprietarios()) {
//            if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
//                sacado = new Sacado(p.getNome(), p.getCnpj());
//            } else {
//                sacado = new Sacado(p.getNome(), p.getCpf());
//            }
//        }
//    public void returnPesRegImovel(Imovel i) {
//        System.out.println(i.getRegImovel());
//    } 
    public void genereatorBillet() throws IOException {
        /*
         * INFORMANDO DADOS SOBRE O CEDENTE.
         */
//        Cedente cedente = new Cedente("Prefeitura Municipal de Parnaíba - PI", "00.000.000/0001-91");

        /*
         * INFORMANDO DADOS SOBRE O SACADO O PROPRIETÁRIO.
         */
//        Sacado sacado = null; 

        for (Proprietario p : visaoImovel.getProprietarios()) {
            if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
//                sacado = new Sacado(p.getNome(), p.getCnpj());
            } else {
//                sacado = new Sacado(p.getNome(), p.getCpf());
            }
        }
        /*
         * INFORMANDO DADOS SOBRE O SACADOR AVALISTA.
         */
//        SacadorAvalista sacadorAvalista = new SacadorAvalista("Prefeitura Municipal de Parnaíba - PI", "00.000.000/0001-91");

        // Informando o endereço do sacador avalista.
//        org.jrimum.domkee.comum.pessoa.endereco.Endereco enderecoSacAval = new org.jrimum.domkee.comum.pessoa.endereco.Endereco();
//        enderecoSacAval.setUF(UnidadeFederativa.PI);
//        enderecoSacAval.setLocalidade("Parnaíba");
//        enderecoSacAval.setCep(new CEP("59000-000"));
//        enderecoSacAval.setBairro("Grande Centro");
//        enderecoSacAval.setLogradouro("Rua Eternamente Principal");
//        enderecoSacAval.setNumero("001");
//        sacadorAvalista.addEndereco(enderecoSacAval);


        // Informando dados sobre a conta bancária do título.
//        ContaBancaria contaBancaria = new ContaBancaria(BancosSuportados.BANCO_DO_BRASIL.create());
//        contaBancaria.setNumeroDaConta(new NumeroDaConta(123456, "0"));
//        contaBancaria.setCarteira(new Carteira(30));
//        contaBancaria.setAgencia(new Agencia(1234, "1"));

//        Titulo titulo = new Titulo(contaBancaria, sacado, cedente, sacadorAvalista);
//        titulo.setNumeroDoDocumento(String.valueOf(visaoImovel.getId()));
//        titulo.setNossoNumero("99345678912");
//        titulo.setDigitoDoNossoNumero("5");
//        titulo.setValor(BigDecimal.TEN);
//        titulo.setDataDoDocumento(new Date());
//        titulo.setDataDoVencimento(new Date());
//        titulo.setTipoDeDocumento(TipoDeTitulo.DIVIDA_ATIVA_DE_MUNICIPIO);
//        titulo.setAceite(Titulo.Aceite.A);
//        titulo.setDesconto(new BigDecimal(0.05));
//        titulo.setDeducao(BigDecimal.ZERO);
//        titulo.setMora(BigDecimal.ZERO);
//        titulo.setAcrecimo(BigDecimal.ZERO);
//        titulo.setValorCobrado(BigDecimal.TEN);

        /*
         * INFORMANDO OS DADOS SOBRE O BOLETO.
         */
//        Boleto boleto = new Boleto(titulo);

//        boleto.setLocalPagamento("Pagável preferencialmente na Rede Banco do Brasil "
//                + "ou casas Lotéricas");
//        boleto.setInstrucaoAoSacado("Senhor sacado, Pagamento referente a averbação  "
//                + "realizado na Prefeitura Municipal de Parnaíba - PI");
//
//
//        boleto.setInstrucao1("DESCRIÇÃO IMÓVEL ");
//        boleto.setInstrucao2("Rua    : "+ visaoImovel.getEnderecoImovel().getLogradouro());
//        boleto.setInstrucao3("Bairro : "+ visaoImovel.getEnderecoImovel().getBairro());
//        boleto.setInstrucao4("Num   : "+ visaoImovel.getEnderecoImovel().getNumero());
//        boleto.setInstrucao5("Cep    :" + visaoImovel.getEnderecoImovel().getCep());
//        boleto.setInstrucao6("PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00");
//        boleto.setInstrucao7("PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR QUE VOCÊ QUISER!");
//        boleto.setInstrucao8("APÓS o Vencimento, Pagável Somente na Rede X.");


//        BoletoViewer boletoViewer = new BoletoViewer(boleto);
//        byte[] pdfAsBytes = boletoViewer.getPdfAsByteArray();

//        imovelDao.reportBillet(pdfAsBytes);

    }

    public void reportRegImovel() {
        HashMap parametros = new HashMap();

        pesProprietario.setCpf(Caracter.removecaracter(pesProprietario.getCpf()));
        pesProprietario.setCnpj(Caracter.removecaracter(pesProprietario.getCnpj()));
        pesEndereco.setCep(Caracter.removecaracter(pesEndereco.getCep()));

        imovelDao.reportsAtlasMobileRegImovel(parametros, pesImovel, pesProprietario, pesEndereco);
    }

    public void update() {
        try {
            System.err.println(visaoInscricao);
            String[] str = visaoInscricao.split("\\.");
            editImovel.setInscricaoCadastralD(Integer.parseInt(str[0]));
            editImovel.setInscricaoCadastralS(Integer.parseInt(str[1]));
            editImovel.setInscricaoCadastralQuadra(Integer.parseInt(str[2]));
            editImovel.setInscricaoCadastralLote(Integer.parseInt(str[3]));
            editImovel.setInscricaoCadastralUnid(Integer.parseInt(str[4]));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            for (Proprietario pro : editImovel.getProprietarios()) {
                if (pro.getId() == null) {
                    proprietarioService.save(pro);
                }else{
                    proprietarioService.update(pro);
                }
            }
            editImovel.setCoordenadas(coordenadas);
            for (Annex annexo : annexs) {
                if (annexo.getId() == null) {
                    annexService.save(annexo);
                }
            }
            editImovel.setAnnex(annexs);
            for (Annex annexo : annexCroquis) {
                if (annexo.getId() == null) {
                    annexService.save(annexo);
                }
            }
            editImovel.setAnnexCroquis(annexCroquis);

            if (editImovel.getEnderecoImovel() != null) {
                if (editImovel.getEnderecoImovel().getCep() != null && !editImovel.getEnderecoImovel().getCep().equals("")) {
                    editImovel.getEnderecoImovel().setCep(Caracter.removecaracter(editImovel.getEnderecoImovel().getCep()));
                }
            }

            if (editImovel.getEnderecoCorrespondencia() != null) {
                if (editImovel.getEnderecoCorrespondencia().getCep() != null && !editImovel.getEnderecoCorrespondencia().getCep().equals("")) {
                    editImovel.getEnderecoCorrespondencia().setCep(Caracter.removecaracter(editImovel.getEnderecoCorrespondencia().getCep()));
                }
            }
             
//            editImovel.setProprietarios(editImovel.getProprietarios());

            imovelDao.update(editImovel);
            editImovel = imovelDao.find(editImovel.getId());
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void eventChangePatrimonioUniao() {
        if (!editImovel.getPatrimonio().equals(Patrimonio.UNIAO)) {
            editImovel.setRip(null);
            editImovel.setRipNomeCadastrado(null);
            editImovel.setVinculoTitularRip(null);
            editImovel.setTitularFalecido(null);
        }
    }

    public List<Proprietario> autocompletePeople(String query) {
        if (proprietario.getTipoDocumento().equals(TipoDocumento.CPF)) {
            return proprietarioService.autocompletePhysical(query);
        }
        return proprietarioService.autocompleteCompany(query);
    }

    public void removerProprietario(Proprietario p) {
        editImovel.getProprietarios().remove(p);
    }

    public void editProprietario(Proprietario p) {
        proprietario = p;
        editImovel.getProprietarios().remove(p);
    }

    public void addProprietario() {
        if (editImovel.getProprietarios() == null) {
            editImovel.setProprietarios(new ArrayList<Proprietario>());
        }
        if (!editImovel.getProprietarios().contains(proprietario) && proprietarioIsSet()) {
//            proprietario.setImovel(editImovel);
            if (proprietario.getCpf() != null && !proprietario.getCpf().equals("")) {
                proprietario.setCpf(Caracter.removecaracter(proprietario.getCpf()));
            }
            if (proprietario.getCnpj() != null && !proprietario.getCnpj().equals("")) {
                proprietario.setCnpj(Caracter.removecaracter(proprietario.getCnpj()));
            }
            if (!editImovel.getProprietarios().contains(proprietario)) {
                editImovel.getProprietarios().add(proprietario);
            }
        }

        TipoDocumento tipoDocumento = proprietario.getTipoDocumento() == null ? TipoDocumento.CPF : proprietario.getTipoDocumento();
        proprietario = new Proprietario();
        proprietario.setTipoDocumento(tipoDocumento);
    }

    private boolean proprietarioIsSet() {
        if ((proprietario.getNome() != null && !proprietario.getNome().equals(""))
                || (proprietario.getNomeFantasia() != null && !proprietario.getNomeFantasia().equals(""))) {
            return true;
        }
        Msg.messagemError("Nome do proprietário é obrigatório");
        return false;
    }

    public void existProprietario() {
        proprietarioService.removeCaracterDocument(proprietario);
        if (proprietario.getTipoDocumento() == TipoDocumento.CPF) {
            if (proprietario.getCpf().equals("")) {
                proprietario = new Proprietario();
                proprietario.setTipoDocumento(TipoDocumento.CPF);
            } else {
                proprietario = proprietarioService.existDocuments(proprietario);
            }
        } else if (proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
            if (proprietario.getCnpj().equals("")) {
                proprietario = new Proprietario();
                proprietario.setTipoDocumento(TipoDocumento.CNPJ);
            } else {
                proprietario = proprietarioService.existDocuments(proprietario);
            }
        }
    }

    public void handleAnnex(FileUploadEvent event) throws IOException {
        handleAnnexAux(event.getFile().getContents(), event.getFile().getFileName(),
                event.getFile().getContentType(), event.getFile().getInputstream());
    }

    private void handleAnnexAux(byte[] imageBytes, String nome, String tipo, InputStream is) throws IOException {

        byte[] bytes = imageBytes;
        if (bytes != null) {
            annex.setType(tipo);
            if (annex.getDescription() == null || annex.getDescription().trim().equals("")) {
                annex.setDescription(nome);
            }
            annex.setFileByte(bytes);
            annexs.add(annex);

            annex = new Annex();

            Msg.messagemInfo("Anexado com Sucesso");
        }
    }

    public void removeAnnex(Annex annex) {
        try {
            annexs.remove(annex);
            Msg.messagemInfo("Anexo removido com sucesso !");
        } catch (Exception e) {
            Msg.messagemError(Msg.Failure);
        }
    }

    public void removeAnnexCroqui(Annex annex) {
        try {
            annexCroquis.remove(annex);
            Msg.messagemInfo("Croqui removido com sucesso !");
        } catch (Exception e) {
            Msg.messagemError(Msg.Failure);
        }
    }

    public void handle(FileUploadEvent event) throws IOException {
        handleAux(event.getFile().getContents(), event.getFile().getFileName(),
                event.getFile().getContentType(), event.getFile().getInputstream());
    }

    private void handleAux(byte[] imageBytes, String nome, String tipo, InputStream is) throws IOException {

        byte[] bytes = imageBytes;
        annexCroqui = new Annex();
        annexCroqui.setType(tipo);
        annexCroqui.setDescription(nome);

        if (bytes != null) {
            annexCroqui.setFileByte(bytes);
            annexCroquis.add(annexCroqui);

            annexCroqui = new Annex();

            Msg.messagemInfo("Anexado com Sucesso");
        }
    }

    public void existeEnderecoImovel() {
        Endereco endereco;
        String num = editImovel.getEnderecoImovel().getNumero();
        Integer codLogra = editImovel.getEnderecoImovel().getCodLogradouro();
        Integer codBairro = editImovel.getEnderecoImovel().getCodBairro();
        String complemento = editImovel.getEnderecoImovel().getCompl();

        endereco = enderecoService.existCep(editImovel.getEnderecoImovel());

        if (endereco != null) {
            editImovel.setEnderecoImovel(endereco);
            editImovel.getEnderecoImovel().setNumero(num);
            editImovel.getEnderecoImovel().setCompl(complemento);
            editImovel.getEnderecoImovel().setCodLogradouro(codLogra);
            editImovel.getEnderecoImovel().setCodBairro(codBairro);
            disableEnderecoImovel = true;
        } else {
            disableEnderecoImovel = false;
        }
    }

    public void existeEnderecoCorrespondencia() {
        Endereco endereco = editImovel.getEnderecoCorrespondencia();
        String num = endereco.getNumero();
        Integer codLogra = endereco.getCodLogradouro();
        Integer codBairro = endereco.getCodBairro();
        String complemento = endereco.getCompl();

        endereco = enderecoService.existCep(editImovel.getEnderecoCorrespondencia());

        if (endereco != null) {
            editImovel.setEnderecoCorrespondencia(endereco);
            editImovel.getEnderecoCorrespondencia().setNumero(num);
            editImovel.getEnderecoCorrespondencia().setCompl(complemento);
            editImovel.getEnderecoCorrespondencia().setCodLogradouro(codLogra);
            editImovel.getEnderecoCorrespondencia().setCodBairro(codBairro);
            disableEnderecoCorrespondencia = true;
        } else {
            disableEnderecoCorrespondencia = false;
        }
    }

    public void usarEnderecoParaCorrespondencia() {
        if (usarMesmoEndereco && editImovel.getEnderecoImovel().getCep() != null
                && !editImovel.getEnderecoImovel().getCep().equals("")) {
            editImovel.setEnderecoCorrespondencia(editImovel.getEnderecoImovel());
        } else {
            disableEnderecoCorrespondencia = false;
            editImovel.setEnderecoCorrespondencia(new Endereco());
        }
    }

    public boolean disabilitarEnderecoCorrespondencia() {
        if ((usarMesmoEndereco && (editImovel.getEnderecoImovel().getCep() != null && !editImovel.getEnderecoImovel().getCep().equals("")))
                || disableEnderecoCorrespondencia) {
            return true;
        }

        return false;
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public List<Imovel> getImoveis() {
        return imoveis;
    }

    public void setImoveis(List<Imovel> imoveis) {
        this.imoveis = imoveis;
    }

    public Proprietario getProprietario() {
        return proprietario;
    }

    public void setProprietario(Proprietario proprietario) {
        this.proprietario = proprietario;
    }

    public Imovel getVisaoImovel() {
        return visaoImovel;
    }

    public void setVisaoImovel(Imovel visaoImovel) {
        this.visaoImovel = visaoImovel;
    }

    public List<Parentesco> getParentesco() {
        List<Parentesco> items = Arrays.asList(Parentesco.values());
        return items;
    }

    public List<SelectItem> tipoDocumentoList() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo.getTipo(), tipo.getNome()));
        }
        return items;
    }

    public List<SelectItem> getComando() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Comando ms : Comando.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getOcupacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Ocupacao ms : Ocupacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getTypeRealty() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (TypeRealty ms : TypeRealty.values()) {
            s.add(new SelectItem(ms, ms.getName()));
        }
        return s;
    }

    public List<SelectItem> getTopografia() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Topografia ms : Topografia.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getSituacaoTerreno() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (SituacaoTerreno ms : SituacaoTerreno.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getPedologia() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Pedologia ms : Pedologia.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getUtilizacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Utilizacao ms : Utilizacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getPatrimonioList() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Patrimonio ms : Patrimonio.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getUsoImovel() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (UsoImovel ms : UsoImovel.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getCaracterizacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Caracterizacao ms : Caracterizacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getComposicaoFamiliar() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (ComposicaoFamiliar ms : ComposicaoFamiliar.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getRendaFamiliar() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (RendaFamiliar ms : RendaFamiliar.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getRevExterno() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (RevExterno ms : RevExterno.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getVinculoTitularRip() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Vinculo ms : Vinculo.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getPiso() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Piso ms : Piso.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getForro() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Forro ms : Forro.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getCobertura() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Cobertura ms : Cobertura.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getInstSanitaria() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (InstSanitaria ms : InstSanitaria.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getPosicao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Posicao ms : Posicao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getTipoDocumentoImovel() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (TipoDocumentoImovel ms : TipoDocumentoImovel.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getTipoConstrucao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (TipoConstrucao ms : TipoConstrucao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getDominioTerra() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (DominioTerra ms : DominioTerra.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getEstrutura() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Estrutura ms : Estrutura.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getEstadoConservacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (EstadoConservacao ms : EstadoConservacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getInstalacoesEletrica() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (InstalacoesEletricas ms : InstalacoesEletricas.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getFachada() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Fachada ms : Fachada.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public Imovel getPesImovel() {
        return pesImovel;
    }

    public void setPesImovel(Imovel pesImovel) {
        this.pesImovel = pesImovel;
    }

    public Proprietario getPesProprietario() {
        return pesProprietario;
    }

    public void setPesProprietario(Proprietario pesProprietario) {
        this.pesProprietario = pesProprietario;
    }

    public Endereco getPesEndereco() {
        return pesEndereco;
    }

    public void setPesEndereco(Endereco pesEndereco) {
        this.pesEndereco = pesEndereco;
    }

    public Imovel getEditImovel() {
        return editImovel;
    }

    public void setEditImovel(Imovel editImovel) {
        this.editImovel = editImovel;
    }

    public LatLng getLatlong() {
        return latlong;
    }

    public void setLatlong(LatLng latlong) {
        this.latlong = latlong;
    }

    public Coordenada getCoordenada() {
        return coordenada;
    }

    public void setCoordenada(Coordenada coordenada) {
        this.coordenada = coordenada;
    }

    public List<Coordenada> getCoordenadas() {
        return coordenadas;
    }

    public void setCoordenadas(List<Coordenada> coordenadas) {
        this.coordenadas = coordenadas;
    }

    public MapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(MapModel mapModel) {
        this.mapModel = mapModel;
    }

    public String getConvN() {
        return convN;
    }

    public void setConvN(String convN) {
        this.convN = convN;
    }

    public String getConvE() {
        return convE;
    }

    public void setConvE(String convE) {
        this.convE = convE;
    }

    public String getConvZona() {
        return convZona;
    }

    public void setConvZona(String convZona) {
        this.convZona = convZona;
    }

    public Coordenada getEditCoordenada() {
        return editCoordenada;
    }

    public void setEditCoordenada(Coordenada editCoordenada) {
        this.editCoordenada = editCoordenada;
    }

    public Coordenada getVisuCoordenada() {
        return visuCoordenada;
    }

    public void setVisuCoordenada(Coordenada visuCoordenada) {
        this.visuCoordenada = visuCoordenada;
    }

    public Coordenada getDelCoordenada() {
        return delCoordenada;
    }

    public void setDelCoordenada(Coordenada delCoordenada) {
        this.delCoordenada = delCoordenada;
    }

    public List<Annex> getAnnexs() {
        return annexs;
    }

    public void setAnnexs(List<Annex> annexs) {
        this.annexs = annexs;
    }

    public Boolean getCima() {
        return cima;
    }

    public void setCima(Boolean cima) {
        this.cima = cima;
    }

    public Boolean getBaixo() {
        return baixo;
    }

    public void setBaixo(Boolean baixo) {
        this.baixo = baixo;
    }

    public List<Annex> getAnnexCroquis() {
        return annexCroquis;
    }

    public void setAnnexCroquis(List<Annex> annexCroquis) {
        this.annexCroquis = annexCroquis;
    }

    public Annex getAnnexCroqui() {
        return annexCroqui;
    }

    public void setAnnexCroqui(Annex annexCroqui) {
        this.annexCroqui = annexCroqui;
    }

    public Morador getMorador() {
        return morador;
    }

    public void setMorador(Morador morador) {
        this.morador = morador;
    }

    public boolean isDisableInputsMorador() {
        return disableInputsMorador;
    }

    public void setDisableInputsMorador(boolean disableInputsMorador) {
        this.disableInputsMorador = disableInputsMorador;
    }

    public boolean isDisableEnderecoImovel() {
        return disableEnderecoImovel;
    }

    public void setDisableEnderecoImovel(boolean disableEnderecoImovel) {
        this.disableEnderecoImovel = disableEnderecoImovel;
    }

    public boolean isDisableEnderecoCorrespondencia() {
        return disableEnderecoCorrespondencia;
    }

    public void setDisableEnderecoCorrespondencia(boolean disableEnderecoCorrespondencia) {
        this.disableEnderecoCorrespondencia = disableEnderecoCorrespondencia;
    }

    public void onMarkerDrag(MarkerDragEvent event) {
        Marker marker = event.getMarker();

        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO, "Coordenadas Alteradas", ""));

        Coordenada c = coordenadas.get(0);

        if (c != null) {
            try {

                CoordinateConversion cc = new CoordinateConversion();

                c.setLat(marker.getLatlng().getLat());
                c.setLog(marker.getLatlng().getLng());

                String str = cc.latLon2UTM(c.getLat(), c.getLog());

                c.setConvE("24" + str.split(" ")[2]);
                c.setConvN(str.split(" ")[3]);

                coordenadaService.update(c);

            } catch (Exception e) {
                Msg.messagemError("Valores Incorretos(COORDENADA)");
            }
        }

    }

    public Annex getAnnex() {
        return annex;
    }

    public void setAnnex(Annex annex) {
        this.annex = annex;
    }

    public String getVisaoInscricao() {
        return visaoInscricao;
    }

    public void setVisaoInscricao(String visaoInscricao) {
        this.visaoInscricao = visaoInscricao;
    }

    public String getCenter() {
        return center;
    }

    public void setCenter(String center) {
        this.center = center;
    }

    public boolean isUsarMesmoEndereco() {
        return usarMesmoEndereco;
    }

    public void setUsarMesmoEndereco(boolean usarMesmoEndereco) {
        this.usarMesmoEndereco = usarMesmoEndereco;
    }
}
